package _02_linked_list.exerc.remove;

import _02_linked_list.exerc.ListNode;
import org.junit.Test;

/**
 * @author: mornd
 * @dateTime: 2023/6/3 - 14:52
 * <p>
 * 删除有序链表中已重复的节点（重复节点一个不留）
 */
public class MyTest4 {
    @Test
    public void test() {
        ListNode list = MyTest.init(new int[]{1,1,2,3,3,4,4});
        System.out.println(list);

        System.out.println(foo1(list));
    }

    /*
        方法1： 提供3个指针，p1 记录重最左侧复节点的上一个节点，p2 和 p3 分别对比相邻的节点值是否相等

        p1   p2   p3
        s -> 1 -> 2 -> 2 -> 3 -> 4

             p1   p2  p3
        s -> 1 -> 2 ->2 -> 3 -> 4

             p1   p2   p3
        s -> 1 -> 3 -> 4

                  p1   p2  p3
        s -> 1 -> 3 -> 4   null

     */
    ListNode foo1(ListNode listNode) {
        // 哨兵节点
        ListNode s = new ListNode(listNode);
        ListNode p1 = s;
        ListNode p2;
        ListNode p3;

        while ((p2 = p1.next) != null && (p3 = p2.next) != null) {
            if(p2.val == p3.val) {
                while ((p3 = p3.next) != null && p3.val == p2.val) {}
                p1.next = p3;
            } else {
                p1 = p1.next;
            }
        }
        return s.next;
    }
}
